from basic_class import *
from Settings import *
import random
class Wall(pygame.sprite.Sprite):  # 障碍物的类
    def __init__(self, type:int,rect: pygame.rect.Rect):
        # 图片这里直接指定了，需要传递的参数是该障碍物在游戏中矩形的位置和大小
        super().__init__(  )
        self.image =pygame.transform.scale(
                pygame.image.load(rf".\assets\map1\wall{type}.png"), (40, 40))
        self.rect = rect
    def draw(
        self, camera: tuple[int, int]
    ):  # 定义显示实体的方法，该方法在场景需要描绘图像的时候调用
        rect = self.rect.move(
            *(-i for i in camera)
        )  # 根据摄像头的位置计算实际要描绘的位置，例如摄像头往上了，实际描绘的位置就要往下
        # 实际上就是将该实体的横纵坐标分别减去摄像头左上角的坐标
        # 这里move方法是产生了一个新的rect，而不是修改了原有的rect。例如，障碍物墙体原本的位置应该是在生成以后就不变的
        # 对于玩家来说，玩家往一个方向移动之后，在这里描绘时又会被向相反方向移动，因此表现出玩家在镜头中间不动的效果
        g_window.blit(self.image, rect)  # 调用pygame的方法描绘图像         
          
            
            
            # 课堂上写的时候rect=rect的位置可能有误，非常抱歉
        


class Tile(
    EntityLike
):  # 地图背景的类，背景是由一个一个方块组成的，每个方块都是该类的实例
    def __init__(self, type: int, rect: pygame.rect.Rect):
        # 这里接受一个int代表该方块使用哪种图片
        super().__init__(
            image=pygame.transform.scale(
                # 根据type来指定图片路径
                pygame.image.load(rf".\assets\map1\ground{type}.jpg"),
                (40, 40),
            ),
            rect=rect,
        )



class SceneLike(Listener):  # 场景的类，管理障碍物、角色、地图背景的描绘、刷新等

    def __init__(self):
        super().__init__()
        self.walls = []  # 存储障碍物的列表
        self.tiles = []  # 存储地图背景方块的列表
        self.monsters = [] # 传递玩家的实例
        self.window_scale = (1000, 800)  # 显示窗口的大小
        self.map_range = (4000, 1000)  # 实际地图的大小
        self.carema = (0, 0)  # 镜头的初始位置
       

        for i in range(len(MapSettings.matrix)):
            for j in range(len(MapSettings.matrix[i])):
                if MapSettings.matrix[i][j] == 2:
                    self.tiles.append(
                    # 方块的种类是随机的，即随机选取一张素材作为该方块
                    # 方块的大小是40*40，根据当前的行数和列数来算出位置
                        Tile(random.randint(1, 5), pygame.Rect(j * 40, i * 40, 40, 40))
                )

        # 在地图里随机生成一些障碍物
        for _ in range(20):
            for i in range(len(MapSettings.matrix)):
                for j in range(len(MapSettings.matrix[i])):
                    if MapSettings.matrix[i][j] == 2:
                        if MapSettings.Room_1['x1']<j<MapSettings.Room_1['x2'] and MapSettings.Room_1['y1']<i<MapSettings.Room_1['y2']:
                            flag = random.randint(0, 500)
                            if flag ==8:
                                self.walls.append(Wall(3,pygame.Rect(j*40,i*40,40,40)))
                                MapSettings.matrix[i][j] = 3
                        if MapSettings.Room_2['x1']<j<MapSettings.Room_2['x2'] and MapSettings.Room_2['y1']<i<MapSettings.Room_2['y2']:
                            flag = random.randint(0, 500)
                            if flag ==8:
                                self.walls.append(Wall(3,pygame.Rect(j*40,i*40,40,40)))
                                MapSettings.matrix[i][j] = 3
                    if MapSettings.matrix[i][j] == 1:
                        self.walls.append(Wall(random.randint(1,2),pygame.Rect(j*40,i*40,40,40)))